﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ruandao.MiniAccess.OrMap
{
    /// <summary>
    /// 用来保存OR映射文件中的&lt;entity&gt;标签的内容。
    /// </summary>
    /// <remarks>
    /// 该类的实例用来如实的记录xml文件中&lt;entity&gt;中的属性设置，
    /// 除了必选属性外都允许null值和""值，前者表示xml中没有显式设定值(也就是使用默认值)，
    /// 后者表示显式设定了空字符串。
    /// <br/>在属性设置时检查必填属性和枚举属性的正确性，如果不合法则抛出异常。
    /// </remarks>
    public class EntityTag
    {
        private string name;

        /// <summary>
        /// 用指定的实体类型名构造实体标签对象，类型名不包括命名空间名字。
        /// <br/>异常：OrMapException(实体的类型名为空串。)
        /// </summary>
        /// <param name="name">实体的类型名。</param>
        public EntityTag(string name)
        {
            if (name == null)
                throw new OrMapException("mdm.xml文件中entity标签的name属性必须指定，而且不能为空串。");
            this.name = name;
        }

        /// <summary>
        /// "name" Attribute: 实体的类型名，不包括命名空间名字。
        /// </summary>
        public string Name
        {
            get { return name; }
        }

        private string table = null;
        /// <summary>
        /// "table" Attribute: 对应的数据库表的名称。
        /// </summary>
        public string Table
        {
            get { return table; }
            set { table = value; }
        }

        private string commandType;
        /// <summary>
        /// "command-type" Attribute: 命令方式，指出是存储过程还是SQL文本。
        /// <br/>异常：OrMapException(设置时指定了无效属性)
        /// </summary>
        public string CommandType
        {
            get { return commandType; }
            set
            {
                if (value != null)
                {
                    if (!(value == "StoredProcedure" || value == "Text"))
                        throw new OrMapException("非法属性值:" + value + ",mdm.xml文件中entity标签的command-type的取值只能是\"StoreProcedure\"或者\"Text\",区分大小写，如不指定则表示采用默认值。默认值由数据提供者确定。");
                }
                commandType = value;
            }
        }

        private string insert;
        /// <summary>
        /// "insert" Attribute: 执行插入命令的存储过程名或者SQL文本。
        /// </summary>
        public string Insert
        {
            get { return insert; }
            set { insert = value; }
        }

        private string delete;
        /// <summary>
        /// "delete" Attribute: 执行按主键删除命令的存储过程名或者SQL文本。
        /// </summary>
        public string Delete
        {
            get { return delete; }
            set { delete = value; }
        }

        private string multipleDelete;
        /// <summary>
        /// "multiple-delete" Attribute: 执行按查询条件批量删除命令的存储过程名或者SQL文本。
        /// </summary>
        public string MultipleDelete
        {
            get { return multipleDelete; }
            set { multipleDelete = value; }
        }

        private string update;
        /// <summary>
        /// "update" Attribute: 执行按主键更新记录命令的存储过程名或者SQL文本。
        /// </summary>
        public string Update
        {
            get { return update; }
            set { update = value; }
        }

        private string fetch;
        /// <summary>
        /// "fetch" Attribute: 执行按主键查找记录命令的存储过程名或者SQL文本。
        /// </summary>
        public string Fetch
        {
            get { return fetch; }
            set { fetch = value; }
        }

        private string search;
        /// <summary>
        /// "search" Attribute: 执行按条件查找记录命令的存储过程名或者SQL文本。
        /// </summary>
        public string Search
        {
            get { return search; }
            set { search = value; }
        }

        private IList<PropertyTag> propertyList = new List<PropertyTag>();
        /// <summary>
        /// 类型中映射到表字段的列表。
        /// <br/>ArgumentNullException(属性不允许设置为null)
        /// </summary>
        public IList<PropertyTag> PropertyList
        {
            get { return propertyList; }
            set { propertyList = value; }
        }

    }
}
